/**
 * @since Dec 3, 2009
 */
package atom.core0.util;

import java.math.BigDecimal;

/**
 * 金额工具.以两位小数为基础.
 * 
 * @author aps-mhc
 * 
 */
public abstract class AmountUtils
{
	private static final double	ZERO	= 0.0001;
	private static final int	SCALE	= 2;

	/**
	 * 判断金额是否相等, 两数之差小于ZERO 视为相等.
	 * 
	 * <pre>
	 * AmountUtils.equals(null, null)	= false
	 * AmountUtils.equals(1, null)      = false
	 * AmountUtils.equals(null, 1)      = false
	 * AmountUtils.equals(2, 2)      	= true
	 * AmountUtils.equals(2, 2.001)     = false
	 * </pre>
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean equals(Double d1, Double d2)
	{
		if (d1 == null || d2 == null)
		{
			return false;
		}

		return Math.abs(d1 - d2) < ZERO;
	}

	/**
	 * 四舍五入.
	 * 
	 * @param value
	 * @return
	 */
	public static double format(double value)
	{
		return new BigDecimal(Double.toString(value)).setScale(SCALE, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 比较.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static int compare(double d1, double d2)
	{
		return new BigDecimal(Double.toString(d1)).setScale(SCALE, BigDecimal.ROUND_HALF_UP).compareTo(
		        new BigDecimal(Double.toString(d2)).setScale(SCALE, BigDecimal.ROUND_HALF_UP));
	}

	/**
	 * 大于.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean gt(double d1, double d2)
	{
		return compare(d1, d2) > 0;
	}

	/**
	 * 等于.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean et(double d1, double d2)
	{
		return compare(d1, d2) == 0;
	}

	/**
	 * 不等于.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean ne(double d1, double d2)
	{
		return compare(d1, d2) != 0;
	}

	/**
	 * 小于.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean lt(double d1, double d2)
	{
		return compare(d1, d2) < 0;
	}

	/**
	 * 大于等于.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean ge(double d1, double d2)
	{
		return compare(d1, d2) >= 0;
	}

	/**
	 * 小于等于.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static boolean le(double d1, double d2)
	{
		return compare(d1, d2) <= 0;
	}

	/**
	 * 加法运算, 结果四舍五入.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static Double add(Double d1, Double d2)
	{
		return new Double(AmountUtils.format(d1.doubleValue() + d2.doubleValue()));
	}

	/**
	 * 减法运算, 结果四舍五入.
	 * 
	 * @param d1
	 * @param d2
	 * @return
	 */
	public static Double subtract(Double d1, Double d2)
	{
		return new Double(AmountUtils.format(d1.doubleValue() - d2.doubleValue()));
	}

	public static boolean isgtZero(double d1)
	{
		return compare(d1, ZERO) > 0;
	}
	public static boolean isgtZero(Double d1)
	{
		if (d1==null)
			return false;
		return compare(d1, ZERO) > 0;
	}	
	public static BigDecimal multiply(double d1,double d2)
	{
		String s1 = String.valueOf(d1);
		String s2 = String.valueOf(d2);
		BigDecimal b1 = new BigDecimal(s1);
		BigDecimal b2 = new BigDecimal(s2);
		BigDecimal bb = b1.multiply(b2);
		return bb;
	}		
	public static BigDecimal divide(double d1,double d2,int scale)
	{
		String s1 = String.valueOf(d1);
		String s2 = String.valueOf(d2);
		BigDecimal b1 = new BigDecimal(s1);
		BigDecimal b2 = new BigDecimal(s2);

		BigDecimal bb = b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP); 
		return bb;
	}		
	public static BigDecimal divide(double d1,double d2)
	{
		String s1 = String.valueOf(d1);
		String s2 = String.valueOf(d2);
		BigDecimal b1 = new BigDecimal(s1);
		BigDecimal b2 = new BigDecimal(s2);

		BigDecimal bb = b1.divide(b2,2,BigDecimal.ROUND_HALF_UP); 
		return bb;
	}		
	public static BigDecimal divide(BigDecimal d1,BigDecimal d2,int scale)
	{
		BigDecimal bb = d1.divide(d2,scale,BigDecimal.ROUND_HALF_UP); 
		return bb;
	}	
	public static BigDecimal divide(BigDecimal d1,BigDecimal d2)
	{
		BigDecimal bb = d1.divide(d2,2,BigDecimal.ROUND_HALF_UP); 
		return bb;
	}	
}
